import json
import os
from typing import List

from loguru import logger
from openai import OpenAI
import re


# 配置目录和参数（保留但不再强依赖）
CHUNK_DIR = "/root/workspace/Task3_水科院/todo_3_应急演练脚本/chunk_results"
OUTPUT_DIR = "/root/workspace/Task3_水科院/todo_3_应急演练脚本/generated_scripts/3级到2级演练"

# qwen-32B API 配置
API_KEY = "sk-6f89326783dd42b3b9c63284ef454cf2"
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
MODEL_ID = "qwen3-32b"


example_script_raw = """# 唐山港大厦火灾事故应急处置综合演练 脚本 

火情发现者：立即呼喊（着火啦！）按响手动报警器，利用消防电话向消防控制室执勤人员报告警情，（报告控制室，8楼东侧办公室起火！）同层办公人员听到呼喊拿起灭火器进行初起火灾扑救。



消防控制室：收到！启动声光报警、应急广播、相关消防设备，切断市电。消防控制室：物业电工请到现场确认断电情况。



物业电工：收到！

消防控制室：拨打2916119报警，我是唐山港大厦消防控制室值班人员，大厦8楼东南侧办公室起火。



消防队电话员：请告知火灾地址？着火楼层？有无人员被困或受伤？现场能看见明火吗？烟雾大小？着火物质？燃烧面积大概多少？联系方式？请保持电话畅通。



消防控制室：8楼办公室打印机起火，引燃房间内纸张、办公桌椅等可燃物品，火势迅速蔓延至整个房间，暂时未发现有人员被困和受伤，现场明火和烟雾较大，联系电话2916941。



消防队电话员：收到！马上出警！（拉响警报）并向现场指挥汇报情况。

消防队电话员：报告现场指挥，唐山港大厦8楼东侧办公室打印机起火，引燃房间内纸张、办公桌椅等可燃物品，火势较大，暂时未发现有人员被困，情况危急，一中队已出警！



现场指挥（消防科长）：明白！立即调派消防二中队一辆消防车、三中队一辆举高消防车前去支援。



消防电话员：收到！

现场指挥（消防科长）：监控中心，唐山港大厦发生火灾，立即启动应急预案，通知交通科、治安科人员赶赴现场。



监控中心：监控中心收到！

监控中心：我是监控中心，唐山港大厦发生火灾，交通科、治安科立即赶赴现场进行交通管制和警戒。



交通科：交通科收到！

治安科：治安科收到！

现场指挥（消防科长）：：各楼层层长汇报人员疏散情况。

各楼层层长（1-16楼）：各层长依次汇报人数！

交通科：报告现场指挥，交通科已到达预定位置，正在对事故现场各个路口进行交通管制。（大厦南门和东门全部实行交通管制）

现场指挥（消防科长）：收到！

治安科：报告现场指挥，治安科已到达预定位置，正在对事故现场人员进行疏散和警戒。（人员疏散集结点拉起警戒线）。



现场指挥（消防科长）：收到！

消防三中队队长：报告现场指挥，消防三中队到达现场，请安排任务！现场指挥（消防科长）：立即展开举高车，准备外功灭火。

消防三中队队长：收到，马上处置！

消防二中队班长：报告现场指挥，消防二中队到达现场，请分配任务！

现场指挥（消防科长）：大厦8楼东南侧办公室起火，消防二中队迅速展开负责内攻搜救、灭火，外功对着火部位降温灭火。



消防二中队队长：收到，马上处置！

消防二中队队长：战斗班长带领2名队员佩戴防护装备开展内攻搜救、灭火。



二队战斗班长：收到！

消防一中队队长：报告现场指挥，消防一中队到达现场，请安排任务！

现场指挥（消防科长）：消防一中队占据水源地，准备车辆供水，展开外功对着火部位降温、灭火。



消防一中队队长：收到，马上处置！

消防一中队队长：准备为二中队和三中队车辆供水并展开楼宇外功灭火。

（利用消火栓和消防车同时为一中队和三中队供水）

一队战斗班长：收到！

消防二中队队长：二中队消防车利用水炮对着火部位楼宇外围进行降温。

二中队驾驶员：收到！

消防三中队队长：举高车操作员展开外攻灭火。

举高车操作员：收到！

消防一中队队长：报告现场指挥，供水干线铺设完成，已开始供水并开展外部降温灭火。



现场指挥（消防科长）：收到！

消防二中队队长：报告现场指挥，内部火势已扑灭。

消防三中队队长：报告现场指挥外部火势已扑灭。

现场指挥（消防科长）：全部收到！所有车辆停止射水和供水。

消防一中队队长：一中队收到！

消防二中队队长：二中队收到！

消防三中队队长：三中队收到！

现场指挥（消防科长）：报告总指挥，现场处置完毕。

总指挥（安保中心主任）：收到！

总指挥（安保中心主任）：所有参演人员集结点集合。"""


def should_include_chunk(chunk):
    """
    判断是否应该包含该chunk作为参考资料
    过滤掉注意事项和附件内容
    """
    if 'primary_section' not in chunk:
        return True
    
    primary_section = chunk['primary_section']
    
    # 过滤掉注意事项
    if primary_section.startswith("4.") and "注意事项" in primary_section:
        return False
    
    # 过滤掉附件内容
    if "附件" in primary_section:
        return False
    
    return True


def call_qwen_api(prompt, system_message="你是一个应急演练方案生成专家", use_stream=False):
    """
    调用qwen-32B API
    """
    try:
        client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
        
        if use_stream:
            # 流式输出
            response = client.chat.completions.create(
                model=MODEL_ID,
                messages=[
                    {"role": "system", "content": system_message},
                    {"role": "user", "content": prompt}
                ],
                stream=True,
                extra_body={"enable_thinking": True}
            )
            
            # 处理流式响应
            content = ""
            for chunk in response:
                if chunk.choices[0].delta.content is not None:
                    content += chunk.choices[0].delta.content
            
            return content
        else:
            # 非流式输出
            response = client.chat.completions.create(
                model=MODEL_ID,
                messages=[
                    {"role": "system", "content": system_message},
                    {"role": "user", "content": prompt}
                ],
                stream=False,
                extra_body={"enable_thinking": False}
            )
            
            return response.choices[0].message.content
        
    except Exception as e:
        logger.debug("调用qwen API失败：" + str(e))
        return None


def generate_3to2_drill_script(chunks_by_level, accident_scenario):
    """
    第一次调用：生成体现从3级预案到2级预案转变的演练脚本
    """
    # 构建3级预案参考资料
    level3_content = ""
    level3_count = 0
    for chunk in chunks_by_level["3级预案"]:
        if 'content' in chunk and 'primary_section' in chunk:
            primary_section = chunk['primary_section']
            # 主要关注应急组织和处置流程
            if "应急" in primary_section or "响应启动" in primary_section or "处置措施" in primary_section:
                level3_count += 1
                level3_content += "【3级预案-片段" + str(level3_count) + "】\n"
                level3_content += "标题：" + primary_section + "\n"
                level3_content += "内容：" + chunk['content'] + "\n\n"
    
    # 构建2级预案参考资料
    level2_content = ""
    level2_count = 0
    for chunk in chunks_by_level["2级预案"]:
        if 'content' in chunk and 'primary_section' in chunk:
            primary_section = chunk['primary_section']
            # 主要关注应急组织和处置流程
            if "应急" in primary_section or "响应启动" in primary_section or "处置措施" in primary_section:
                level2_count += 1
                level2_content += "【2级预案-片段" + str(level2_count) + "】\n"
                level2_content += "标题：" + primary_section + "\n"
                level2_content += "内容：" + chunk['content'] + "\n\n"
    
    logger.debug("第一次调用筛选了：")
    logger.debug("  - 3级预案：" + str(level3_count) + " 个相关片段")
    logger.debug("  - 2级预案：" + str(level2_count) + " 个相关片段")
    
    # 构建生成提示
    prompt = """
        你是一名应急演练编制专家。请基于以下两级应急预案文档片段，生成一份体现“事故态势超出处置能力，从三级预案升级至二级预案”的应急演练脚本。

        【用户输入】
        {accident_scenario}

        【3级预案参考资料】
        {level3_content}

        【2级预案参考资料】
        {level2_content}

        【演练场景】
        假设发生用户指定的事故场景。演练初期按三级预案启动响应，但随着事故态势发展，处置难度和影响范围超出三级预案能力范围，触发升级为二级预案的条件，启动二级预案并展开应对。

        【输出要求】
        1. **表格格式**  
           - 必须输出为 **Markdown 表格**。  
           - 表头列包括：时间 | 流程步骤 | 执行层级（3级/2级） | 负责人/执行人 | 操作要点说明。  
           - 每行对应一个环节，时间从上午九点开始，流程总时长不少于三十分钟，具体到分钟。

        2. **人物与组织要求**  
           - **三级阶段**：必须完整覆盖三级预案参考资料中的所有应急小组，逐一体现职责与具体操作，不得遗漏。  
           - **二级阶段**：必须完整覆盖二级预案参考资料中的所有应急组织，逐一体现职责与具体操作，不得遗漏。  
           - 人物称呼仅限岗位/小组/部门名称（如“应急指挥部”“抢险救援组”），禁止出现具体人名。

        3. **内容要求**  
           - 必须体现 **从3级到2级的升级触发条件和决策过程**，并明确升级的依据和操作细节（严格依照参考资料）。  
           - 必须清晰表现 **两级预案组织机构差异和职责转变**，如指挥层级、处置范围、资源调用的变化。  
           - 各小组/组织必须完成其应尽的所有操作，操作要点说明要详细且符合参考资料。  
           - 所有操作必须是现场可执行的处置动作，且能在演练时间内完成。  
           - 严禁编造参考资料中没有的信息（如人名、地名、车牌号、电话号等）。  
           - **事故类型必须与用户指定的一致**，禁止替换或扩展为其他事故类型。  
           - 严禁出现与该事故类型不符的设备或处置措施（例如：若事故为坍塌事故，则不得出现“液压支撑设备”“地质勘探设备”“结构检测设备”等）。  

        4. **逻辑要求**  
           - 演练流程应符合现实逻辑，体现事故发现—处置—升级—扩大应对—稳定的完整链条。  
           - 升级过程必须自然嵌入脚本，明确由哪个岗位/机构提出并决定升级。  

        请生成符合以上要求的 **完整Markdown表格演练脚本**，只输出脚本内容，不要输出任何其他说明性内容。
    """

    prompt = prompt.format(accident_scenario=accident_scenario, level3_content=level3_content, level2_content=level2_content)
    
    logger.debug("第一次调用：正在生成3级到2级预案升级演练脚本...")
    
    system_message = "你是一个专业的应急演练脚本编写专家，特别擅长设计体现预案级别转变的复杂演练脚本。你的任务是基于用户输入的事故类型，以及提供的预案参考资料，生成结构化、完整、可执行的应急演练脚本。"
    
    result = call_qwen_api(prompt, system_message, use_stream=True)
    
    if result:
        logger.debug("3级到2级预案升级演练脚本生成成功")
        return clean_think_tags(result)
    else:
        logger.debug("3级到2级预案升级演练脚本生成失败")
        return None


def generate_3to2_complete_plan(chunks_by_level, drill_script, accident_scenario):
    """
    第二次调用：基于第一次生成的脚本，生成完整的3级到2级预案升级演练方案
    """
    # 构建3级预案参考资料
    level3_content = ""
    level3_count = 0
    for chunk in chunks_by_level["3级预案"]:
        if 'content' in chunk and 'primary_section' in chunk:
            primary_section = chunk['primary_section']
            if "应急" in primary_section or "响应启动" in primary_section or "处置措施" in primary_section:
                level3_count += 1
                level3_content += "【3级预案-片段" + str(level3_count) + "】\n"
                level3_content += "标题：" + primary_section + "\n"
                level3_content += "内容：" + chunk['content'] + "\n\n"
    
    # 构建2级预案参考资料
    level2_content = ""
    level2_count = 0
    for chunk in chunks_by_level["2级预案"]:
        if 'content' in chunk and 'primary_section' in chunk:
            primary_section = chunk['primary_section']
            if "应急" in primary_section or "响应启动" in primary_section or "处置措施" in primary_section:
                level2_count += 1
                level2_content += "【2级预案-片段" + str(level2_count) + "】\n"
                level2_content += "标题：" + primary_section + "\n"
                level2_content += "内容：" + chunk['content'] + "\n\n"
    
    # 构建生成提示
    prompt = """
        你是一名应急演练方案编制专家。请基于以下输入信息，生成一份完整的应急演练方案，要求体现“事故态势超出处置能力，从三级预案升级至二级预案”的全过程。

        【用户输入】
        {accident_scenario}

        【输入信息】
        - 3级预案参考资料：
        {level3_content}

        - 2级预案参考资料：
        {level2_content}

        - 已生成的演练脚本：
        {drill_script}

        【演练场景】
        假设发生用户指定的事故类型。初期按三级预案响应，但随着事故态势发展，处置能力不足，触发升级为二级预案，启动更高层级的应急响应。

        【方案结构（必须完整输出以下六个部分）】
        1. 演练目的  
        2. 演练组织机构与分工（分别说明三级预案与二级预案的组织差异和衔接关系）  
        3. 事故场景设计  
        4. 演练准备工作（写明地点、物资、设备、通信工具、数量要求等，必须具体）  
        5. 演练脚本（对已生成脚本进行检查和修改，确保与预案一致、无遗漏）  
        6. 演练评估与总结（评估要点和改进方向）

        【生成要求】
        1. **脚本修订**：检查已生成的演练脚本，修正错误或遗漏，确保与预案一致。  
        2. **升级过程突出**：必须写明三级预案升级到二级预案的条件、触发环节、决策依据和职责变化。  
        3. **细节具体**：所有准备和行动必须写清楚地点、物资和数量，不能用模糊词（如“若干”“一些”）。  
        4. **事实约束**：所有事实必须来自预案参考资料，禁止编造不存在的信息（如人名、地名、车牌号、电话号）。  
        5. **人员称呼**：只能使用岗位或小组名称（如“应急指挥部”“抢险救援组”），不能出现具体人名。  
        6. **可执行性**：所有动作必须是现实中能完成的应急处置动作，并能在演练时间内完成。  
        7. **事故一致性**：事故类型必须与用户输入保持一致，禁止替换为其他事故。  
        8. **输出格式**：必须以 **Markdown 格式** 输出完整方案，六个部分都要有清晰的标题。  

        请生成符合以上要求的完整应急演练方案。
    """
    
    prompt = prompt.format(accident_scenario=accident_scenario, level3_content=level3_content, level2_content=level2_content, drill_script=drill_script)
    
    logger.debug("第二次调用：正在生成完整的3级到2级预案升级演练方案...")
    
    system_message = """你是一个专业的应急管理和演练方案编写专家，特别擅长设计体现预案级别转变的复杂演练方案。你需要依据参考资料，设计一个内容完善、丰富的应急演练方案"""
    
    result = call_qwen_api(prompt, system_message, use_stream=True)
    
    if result:
        logger.debug("完整的3级到2级预案升级演练方案生成成功")
        return clean_think_tags(result)
    else:
        logger.debug("完整的3级到2级预案升级演练方案生成失败")
        return None


def generate_3to2_drama_script(drill_script, chunks_by_level, accident_scenario):
    """
    第三次调用：生成3级到2级的对话式演练内容
    """
    try:
        lines = example_script_raw.split('\n')
        non_empty_lines = [line for line in lines if line.strip()][:20]
        example_script = '\n'.join(non_empty_lines)
    except Exception as e:
        logger.debug("处理示例剧本文本失败：" + str(e))
        example_script = ""
    
    # 构建3级预案参考资料
    level3_content = ""
    level3_count = 0
    for chunk in chunks_by_level["3级预案"]:
        if 'content' in chunk and 'primary_section' in chunk:
            primary_section = chunk['primary_section']
            if "应急" in primary_section or "响应启动" in primary_section or "处置措施" in primary_section or "应急保障" in primary_section:
                level3_count += 1
                level3_content += "【3级预案-片段" + str(level3_count) + "】\n"
                level3_content += "标题：" + primary_section + "\n"
                level3_content += "内容：" + chunk['content'] + "\n\n"
    
    # 构建2级预案参考资料
    level2_content = ""
    level2_count = 0
    for chunk in chunks_by_level["2级预案"]:
        if 'content' in chunk and 'primary_section' in chunk:
            primary_section = chunk['primary_section']
            if "应急" in primary_section or "响应启动" in primary_section or "处置措施" in primary_section or "应急保障" in primary_section:
                level2_count += 1
                level2_content += "【2级预案-片段" + str(level2_count) + "】\n"
                level2_content += "标题：" + primary_section + "\n"
                level2_content += "内容：" + chunk['content'] + "\n\n"

    # 构建生成提示
    prompt = """
        你是一名应急演练脚本编制专家。请将表格形式的演练脚本转换为对话式应急演练内容，必须完整体现“从三级预案升级到二级预案”的全过程。

        【用户输入】
        {accident_scenario}

        【输入信息】
        - 3级到2级演练脚本（表格，需要转换成对话）：
        {drill_script}

        - 3级预案参考资料：
        {level3_content}

        - 2级预案参考资料：
        {level2_content}

        - 示例对话式脚本格式（参考格式和对话风格）：
        {example_script}

        【输出目标】  
        生成一份完整的对话式应急演练脚本，必须覆盖从事故发现 → 三级预案响应 → 升级触发 → 二级预案响应 → 事故处置全过程。

        【输出格式要求】  
        1. 输出必须是 **Markdown 格式**。  
        2. 每一句对话都必须是 “岗位/小组：对话内容” 的形式。  
        3. 不能出现拟声词（如“警报声”“轰隆”）、不能有背景声描述。  
        4. 对话要足够详细、专业，逐条覆盖表格脚本中的每个步骤。  

        【人员要求】  
        1. 对话式脚本中仅出现核心人员：现场操作人员、指挥人员、应急人员。  
        2. 严禁出现以下人员或环节：善后工作组、信息公开组、新闻发布、外部救援、政府部门、赔偿、事故快报、拨款等。
        3. 称呼只能用岗位或小组名称，禁止使用人名。  

        【内容要求】  
        1. 对话内容必须严格基于“3级到2级演练脚本”和预案参考资料，逐步转化为对话，不得遗漏。  
        2. 必须清晰体现从三级预案到二级预案的 **升级条件、决策过程和依据**，这些内容必须来自参考资料。  
        3. 严禁编造任何资料中没有的信息（如人名、地名、车牌号、电话号等）。  
        4. 所有处置动作必须是演练中可以实际完成的操作，不能出现与事故不符的设备（如“液压支撑设备”“地质勘探设备”“结构检测设备”）。  
        5. 时间顺序要合理，演练节奏要符合实际，突出不同小组之间的协同和联动。  

        【硬性禁止规则（必须严格执行）】  
        1. 输出对话式脚本时，不得出现以下人员或内容：  
           - 善后工作组、信息公开组、新闻发布、政府部门、赔偿、保险理赔、拨款、外部救援队伍、外部医院。  
        2. 即使这些人员或内容在输入资料中出现，也必须直接忽略，不得写入输出脚本。  
        3. 仅能保留现场应急处置所需的核心岗位：应急指挥部、各应急小组、现场操作人员。
        4. 输入材料与提示词内容冲突时，优先以提示词为准，严格执行提示词的要求，一旦出现不允许出现的内容，你的输出就是错误的。

        请生成完整的对话式应急演练脚本，除脚本外不要输出任何其他说明性内容。
    """

    prompt = prompt.format(accident_scenario=accident_scenario, drill_script=drill_script, level3_content=level3_content, level2_content=level2_content, example_script=example_script)
    
    logger.debug("第三次调用：正在生成3级到2级对话式演练内容...")
    
    system_message = """你是一个专业的应急演练对话式脚本编写专家，擅长将演练脚本转换为对话形式。你需要保持专业性的同时，让对话自然流畅，符合应急处置的实际场景。"""
    
    result = call_qwen_api(prompt, system_message, use_stream=True)
    
    if result:
        logger.debug("3级到2级对话式演练内容生成成功")
        return clean_think_tags(result)
    else:
        logger.debug("3级到2级对话式演练内容生成失败")
        return None


def clean_think_tags(content):
    """
    清理内容中的<think></think>标签及其内容
    """
    if not content:
        return content
    
    # 删除<think></think>标签及其内容
    cleaned_content = re.sub(r'<think>.*?</think>', '', content, flags=re.DOTALL)
    # 清理多余的空行
    cleaned_content = re.sub(r'\n\s*\n\s*\n', '\n\n', cleaned_content)
    # 去除开头的空行
    cleaned_content = cleaned_content.strip()
    
    return cleaned_content


def integrate_drama_into_plan(complete_plan, drama_script):
    """
    将对话式演练内容插入到完整演练方案中
    """
    if not drama_script:
        return complete_plan
    
    # 直接在最后插入对话脚本
    drama_section = f"""

## 对话式演练脚本

{drama_script}

"""
    
    return complete_plan + drama_section


def save_script(script_content, script_name):
    """
    保存生成的演练脚本
    """
    if not os.path.exists(OUTPUT_DIR):
        os.makedirs(OUTPUT_DIR)
    
    output_path = os.path.join(OUTPUT_DIR, script_name + ".md")
    
    try:
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(script_content)
        
        logger.debug("脚本已保存到：" + output_path)
        return output_path
        
    except Exception as e:
        logger.debug("保存脚本失败：" + str(e))
        return None


def load_chunks_by_level(level, json_path: str):
    """
    按预案级别加载chunks
    """
    level_chunks = []
    level_json_path = json_path.replace(".json", f"_{level}.json")
    try:
        with open(level_json_path, 'r', encoding='utf-8') as f:
            chunks_data = json.load(f)
        for chunk in chunks_data:
            if should_include_chunk(chunk):
                chunk['plan_level'] = "1级预案" if level == "321" else "2级预案" if level == "32" else "3级预案"
                level_chunks.append(chunk)
        return level_chunks
    except Exception as e:
        logger.debug("读取文件失败：" + json_path + " 错误：" + str(e))
        return []

def _load_32_chunks_from_json(json_path: str):
    """
    从单个JSON文件加载并按级别分组chunks。
    要求：chunk需包含字段 plan_level，其值为"3级预案"或"2级预案"。
    返回：(chunks_by_level: dict, all_chunks: list)
    """
    if not os.path.isfile(json_path):
        raise FileNotFoundError("chunks JSON 文件不存在：" + str(json_path))
    try:
        level2 = load_chunks_by_level("32", json_path)
        level3 = load_chunks_by_level("3", json_path)

        chunks_by_level = {"3级预案": level3, "2级预案": level2}
        all_chunks = level3 + level2
        if not all_chunks:
            raise ValueError("未从 JSON 中解析到有效的3级/2级片段（缺少plan_level字段）")
        logger.debug("总共加载了 " + str(len(all_chunks)) + " 个有效文档片段")
        logger.debug("  - 3级预案：" + str(len(level3)) + " 个")
        logger.debug("  - 2级预案：" + str(len(level2)) + " 个")
        return chunks_by_level, all_chunks
    except Exception as e:
        raise RuntimeError("读取或解析 chunks JSON 失败：" + str(e))


def run_emergency_32(chunks_json_path: str, accident_scenario: List[str]):
    """
    对外暴露的函数：
    - 参数：单个 chunks JSON 文件的绝对路径（需包含 plan_level 字段）
    - 行为：校验文件 → 加载并按级别分组 → 生成三个结果 → 保存至同级 statistics 目录 → 返回结果与路径
    返回：
    {
      "drill_script_path": str,
      "complete_plan_path": str,
      "drama_script_path": Optional[str],
      "final_plan_path": Optional[str],
      "drill_script": str,
      "complete_plan": str,
      "drama_script": Optional[str],
      "final_plan": Optional[str]
    }
    """
    if not chunks_json_path or not os.path.isfile(chunks_json_path):
        raise FileNotFoundError("chunks JSON 文件不存在：" + str(chunks_json_path))

    parent_dir = os.path.dirname(chunks_json_path)
    stats_dir = os.path.join(parent_dir, "statistics")
    try:
        os.makedirs(stats_dir, exist_ok=True)
    except Exception as e:
        raise RuntimeError("创建统计目录失败：" + str(e))

    chunks_by_level, all_chunks = _load_32_chunks_from_json(chunks_json_path)

    drill_script = generate_3to2_drill_script(chunks_by_level, accident_scenario)
    if not drill_script:
        raise RuntimeError("3级到2级预案升级演练脚本生成失败")

    drill_script_path = os.path.join(stats_dir, "3级到2级预案升级演练脚本.md")
    with open(drill_script_path, 'w', encoding='utf-8') as f:
        f.write(drill_script)

    complete_plan = generate_3to2_complete_plan(chunks_by_level, drill_script, accident_scenario)
    if not complete_plan:
        raise RuntimeError("3级到2级预案升级演练方案生成失败")

    complete_plan_path = os.path.join(stats_dir, "3级到2级预案升级演练方案_完整版.md")
    with open(complete_plan_path, 'w', encoding='utf-8') as f:
        f.write(complete_plan)

    drama_script = generate_3to2_drama_script(drill_script, chunks_by_level, accident_scenario)
    final_plan = None
    drama_script_path = None
    final_plan_path = None
    if drama_script:
        drama_script_path = os.path.join(stats_dir, "3级到2级预案升级演练_对话式脚本.md")
        with open(drama_script_path, 'w', encoding='utf-8') as f:
            f.write(drama_script)
        final_plan = integrate_drama_into_plan(complete_plan, drama_script)
        final_plan_path = os.path.join(stats_dir, "3级到2级预案升级演练方案_最终版.md")
        with open(final_plan_path, 'w', encoding='utf-8') as f:
            f.write(final_plan)

    return {
        # "drill_script_path": drill_script_path,
        # "complete_plan_path": complete_plan_path,
        # "drama_script_path": drama_script_path,
        # "final_plan_path": final_plan_path,
        "drill_script": drill_script,
        "complete_plan": complete_plan,
        "drama_script": drama_script,
        "final_plan": final_plan,
    }


if __name__ == "__main__":
    logger.debug("请通过 run_emergency_32(chunks_json_path) 调用该模块功能。")
